package com.ccubee.data.transfer.event;

import com.ccubee.data.transfer.utils.StringUtils;
import io.netty.util.internal.StringUtil;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.function.Function;

/**
 * 数据类型索引
 *
 * @Author ycf
 * @Date 2022/5/22 18:22
 * @Version 1.0
 */
@AllArgsConstructor
@Getter
@Slf4j
public enum DataTypeIndex {
    /**
     * 支持的处理类型
     */
    INDEX_12(12, "VARCHAR", String.class.getName(), i -> i),
    INDEX_1(1, "CHAR", String.class.getName(), i -> i),
    INDEX_04(-4, "BLOB", "java.lang.byte[]", i -> i),
    INDEX_01(-1, "TEXT", String.class.getName(), i -> i),
    INDEX_4(4, "INTEGER", Integer.class.getName(), Integer::parseInt),
    INDEX_06(-6, "TINYINT,MEDIUMINT", Integer.class.getName(), Integer::parseInt),
    INDEX_5(5, "SMALLINT", Integer.class.getName(), Integer::parseInt),
    INDEX_07(-7, "BIT", Boolean.class.getName(), Boolean::parseBoolean),
    INDEX_05(-5, "BIGINT", BigInteger.class.getName(), i -> {
        if (Objects.nonNull(i) && i.isEmpty()) {
            return null;
        }
        return new BigInteger(i);
    }),
    INDEX_7(7, "FLOAT", Float.class.getName(), Float::parseFloat),
    INDEX_8(8, "DOUBLE", Double.class.getName(), Double::parseDouble),
    INDEX_3(3, "DECIMAL", BigDecimal.class.getName(), BigDecimal::new),
    INDEX_91(91, "DATE,YEAR", Date.class.getName(), i -> StringUtils.isEmpty(i) ? null : i),
    INDEX_92(92, "TIME", LocalTime.class.getName(), i -> StringUtils.isEmpty(i) ? null : i),
    INDEX_93(93, "DATETIME", LocalDateTime.class.getName(), i -> StringUtils.isEmpty(i) ? null : i),
    ;
    /**
     * 索引
     */
    private final int index;
    /**
     * 数据库类型
     */
    private final String dbType;
    /**
     * java类型
     */
    private final String type;
    /**
     * 数据转换
     */
    private final Function<String, Object> function;
    private static final Map<Integer, DataTypeIndex> MAP = new HashMap<>(20);

    static {
        for (DataTypeIndex value : values()) {
            MAP.put(value.getIndex(), value);
        }
    }

    /**
     * 转换
     *
     * @param value 数据参数
     * @return 结果
     */
    public Object to(String value) {
        return getFunction().apply(value);
    }

    public static DataTypeIndex of(int sqlType) {
        return MAP.get(sqlType);
    }

    public static Object of(int sqlType, String value) {
        if (!MAP.containsKey(sqlType)) {
            return value;
        }
        if (Objects.isNull(value)) {
            return null;
        }
        try {
            return MAP.get(sqlType).to(value);
        } catch (Exception e) {
            log.error("error:{},{}", value, e.getMessage(), e);
        }
        return value;
    }
}
